package com.cskaoyan.javase.array.method8;

/**
 * @description: 方法的传值问题
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Arrays;

/**
 * Java中方法到底是值传递还是引用传递？
 * 值传递：调用方法时，传入的实参是一个参数的拷贝，原先的数据在方法结束后没有被改变
 * 引用传递：调用方法时，传入的是实参的地址，而不是拷贝，原先的数据在方法结束后会变化
 *
 * 引用数据类型对象是有地址
 * 注意基本数据类型也是有地址
 *
 * 低水平的博客作者：Java基本数据类型是值传递，引用数据类型是引用传递  大错特错的
 *
 * 实际上Java只有一种传递，只有值传递
 *
 */

public class Demo {
    public static void main(String[] args) {
        //通过这个简单的案例，好像Java是值传递的，针对于基本数据类型
        int a = 2;
        //doubleIntValue(a);
        System.out.println(a);
        a = doubleIntValue(a);
        //a = a * 2;
        //System.out.println("--------------------------");
        //通过这个简单的案例，好像Java是引用传递，针对引用数据类型
        //定义一个数组
        /*int[] arr = {1, 2, 3};
        doubleArrayValue(arr);
        System.out.println(Arrays.toString(arr));*/

        //System.out.println("------------------------");
        int[] arr1 = {8, 8, 8};
        int[] arr2 = {6, 6, 6};
        /*int[] temp;
        temp = arr1;
        arr1 = arr2;
        arr2 = temp;*/
        System.out.println("交换之前的数组");
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        swapArray(arr1, arr2);
        System.out.println("交换后的数组");
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        //交换不成功，说明Java是值传递
        //如果是值传递，交换成不成功？
        //不成功
        //如果是引用传递，交换成不成功？
        //成功


    }

    //需求是：把一个int类型的数据 改变成原先的两倍
    public static int doubleIntValue(int a) {
        //a = a * 2;
        //a *= 2;
        return a * 2;
    }

    //需求是：把一个int类型的数组中元素值都乘以2
    public static void doubleArrayValue(int[] arr) {
        //遍历数组 并乘以2
        for (int i = 0; i < arr.length; i++) {
            arr[i] *= 2;
        }
    }

    //交换两个引用数据类型的对象，交换两个数组，交换两个数组的引用
    public static void swapArray(int[] arr1, int[] arr2) {

        //怎么交换两个数组？
        //仍然需要一个中间引用
        int[] temp;
        //交换
        temp = arr1;
        arr1 = arr2;
        arr2 = temp;

        System.out.println("方法当中交换后的");
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
    }
}
